Amazon DocumentDB のコンソール画面からたどり着けるハンズオンコンテンツのご紹介とコマンドの最新版
コーヒーが好きな emi です。
DocumentDB について学習コンテンツを探していましたところ、マネジメントコンソールから DocumentDB のハンズオンコンテンツにたどり着けることに気づきました。ハンズオンコンテンツをそのまま実行するといくつかバージョンの関係でうまくいかないところがありましたので、補足を交えつつご紹介します。
構成図
ハンズオンを実施すると以下のような構成で DocumentDB を構築できます。Cloud9 から DocumentDB に接続してクエリをいくつか実行します。
ハンズオンコンテンツの場所
ハンズオンコンテンツは DocumentDB コンソールの左ナビゲーションペインの下部からたどり着けます。動画やブログへのリンクもありますが、今回は「セルフサービストレーニング」タブを開き、「Amazon DocumentDB (MongoDB 互換) の使用を開始する」を選択していただくと、AWS Skill Builder(以降「スキルビルダー」と記載)のコンテンツに飛び、ハンズオンを実施することができます。
AWS Skill Builder へのログインとハンズオン開始
「Amazon DocumentDB (MongoDB 互換) の使用を開始する」をクリックすると、以下のスキルビルダー画面に遷移します。このままだと英語なので、「日本語」をクリックしてください。
日本語でハンズオンを実施することができます。「ENROLL」をクリックします。
ハンズオンコンテンツはスキルビルダーで提供されていますので、AWS スキルビルダー ID でのログインが必要です。「SIGN IN TO AWS SKILL BUILDER」をクリックします。
AWS スキルビルダー ID でログインします。AWS スキルビルダー ID が無い方は無料で作成できますので、お手数ですが作成をお願いします。私は作成済みでしたので、そのままサインインしました。
サインインできたら、「ENROLL」を続行します。「START LEARNING NOW」をクリックすると、コンテンツが開始されます。
このような画面で学習を開始できます。
日本語のコースを選ぶと、字幕ではなく、分かりやすい日本語解説の動画を視聴できます。
概要
以下のようなアジェンダで学習をすすめます。
- このコースの利用方法
- Amazon DocumentDB の基礎
- アーキテクチャとユースケース
- AMAZON DOCUMENTDB の使用
- Amazon DocumentDB クラスターの作成
- Amazon DocumentDB でのデータの挿入とクエリ
- Amazon DocumentDB で AWS CLI を使用する
- プログラミング言語を使用して Amazon DocumentDB に接続する
- その他のリソース
座学部分、動画部分があります。DocumentDB の概要やユースケースを学んだあと、実際に DocumentDB クラスターを作成する手順が動画で提供されます。
既存のハンズオンコンテンツでの注意点
2024/3/30 現在、以下のような注意点がありました。
- Cloud9 をスキルビルダーの手順で作成するとプラットフォームが Amazon Linux 2023 になります。
- DocumentDB に接続するためにインストールする mongo shell がスキルビルダーで案内されているバージョンだと Amazon Linux 2023 に対応していません。
- スキルビルダーで提供されているコマンドは MongoDB 4.0 バージョンという、2024/3/30 現在では古いものとなっています。
- Cloud9 から DocumentDB への接続を TLS 暗号化するための証明書バンドルが古いものとなっています。
- AWS CLI を使用した DocumentDB の作成の部分で提供されるコマンドでは削除保護が有効になります。
そのまま動画の手順に従っていたところ、ハンズオンで少し躓いた部分がありました。以下に最新版のコマンドや補足を記載していきます。
最新版コマンド
まずは動画の手順に従って DocumentDB クラスターを作成しましょう。docdb-yyyy-mm-dd-hh-mm-ss
という名前のクラスターができます。
リポジトリファイルの作成
以降のコマンドはハンズオンで作成した Cloud9(Amazon Linux 2023)で実行します。
以下のコマンドで yum
リポジトリの設定をシステムに追加します。
リポジトリ情報を /etc/yum.repos.d/mongodb-org-7.0.repo
ファイルに書き込みます。
echo -e "[mongodb-org-7.0]\nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/7.0/x86_64/\ngpgcheck=1\nenabled=1\ngpgkey=https://pgp.mongodb.com/server-7.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-7.0.repo
▼実行結果例
EmiKitani:~/environment $ echo -e "[mongodb-org-7.0]\nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/7.0/x86_64/\ngpgcheck=1\nenabled=1\ngpgkey=https://pgp.mongodb.com/server-7.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-7.0.repo [mongodb-org-7.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/7.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://pgp.mongodb.com/server-7.0.asc EmiKitani:~/environment $
上記コマンドでは MongoDB のバージョン 7.0 相当をインストールするためのリポジトリを Amazon Linux のパッケージマネージャ(yum
)の設定に追加しています。
追記:2023/3/30 時点で DocumentDB はまだ Mongo7.0 をサポートしておりませんでした。本記事で案内するコマンドは稼働確認を取っておりますが、手順は参考としてみて下さい。
echo
コマンドを使用して MongoDB 7.0 のyum
リポジトリ設定をテキストとして生成しています。この設定にはリポジトリの名前、基本 URL、GPG キーの URL などが含まれます。-e
オプションは、echo
が特殊文字(今回は改行文字\n
)を解釈するように設定します。tee
コマンドは標準入力から受け取った内容をファイル(今回は/etc/yum.repos.d/mongodb-org-7.0.repo
)に書き出し、また標準出力にも出力します。
このコマンドを実行することで、MongoDB のリポジトリ情報が /etc/yum.repos.d/mongodb-org-7.0.repo
ファイルに保存され、yum
パッケージマネージャーがこのリポジトリを使用して MongoDB パッケージをインストールできるようになります。
/etc/yum.repos.d/mongodb-org-7.0.repo
に MongoDB のリポジトリ情報が保存できたか確認します。
cat /etc/yum.repos.d/mongodb-org-7.0.repo
▼実行結果例
EmiKitani:~/environment $ cat /etc/yum.repos.d/mongodb-org-7.0.repo [mongodb-org-7.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/7.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://pgp.mongodb.com/server-7.0.asc EmiKitani:~/environment $
保存されていますね。
では、yum
のリポジトリ情報を更新します。
sudo yum update
▼実行結果例
EmiKitani:~/environment $ sudo yum update Amazon Linux 2023 repository 48 MB/s | 26 MB 00:00 Amazon Linux 2023 Kernel Livepatch repository 648 kB/s | 165 kB 00:00 MongoDB Repository 32 kB/s | 26 kB 00:00 Dependencies resolved. Nothing to do. Complete! EmiKitani:~/environment $
リポジトリに関する補足(クリックで展開)
- リポジトリとは
- リポジトリは、ソフトウェアパッケージとそれに関連するメタデータを保存するための中央の保管場所です。
- メタデータには、パッケージの名前、バージョン、依存関係などの情報が含まれます。
- 各リポジトリは一意の名前で識別されます(例:
mongodb-org-7.0
)。
- リポジトリ情報の設定
- リポジトリ情報は、
/etc/yum.repos.d/
ディレクトリ内の.repo
ファイルに保存されます。 - 各
.repo
ファイルには、リポジトリの名前、URL、GPG キーなどの情報が含まれます。 yum
はこれらの.repo
ファイルを読み込んで、利用可能なリポジトリとそれらが提供するパッケージを認識します。
- リポジトリ情報は、
- パッケージのインストール
yum install
コマンドを実行すると、yum
は設定されたリポジトリを検索して、指定されたパッケージを探します。- リポジトリ内のメタデータを参照して、パッケージの依存関係を解決し、適切な順序でパッケージをダウンロードしてインストールします。
- MongoDB の場合、デフォルトの Amazon Linux 2023 のリポジトリには MongoDB パッケージが含まれていません。そのため、MongoDB の公式リポジトリ情報を手動で追加する必要があります。
/etc/yum.repos.d/mongodb-org-7.0.repo
ファイルを作成し、そこに MongoDB 7.0 のリポジトリ情報を書き込むことで yum
が MongoDB の公式リポジトリを認識できるようになります。
では、次のコマンドで mongosh
を使うための mongodb-mongosh-shared-openssl3
パッケージをインストールします。
sudo yum install -y mongodb-mongosh-shared-openssl3
実行結果例(クリックで展開)
EmiKitani:~/environment $ sudo yum install -y mongodb-mongosh-shared-openssl3 Last metadata expiration check: 0:00:33 ago on Thu Mar 28 20:43:26 2024. Dependencies resolved. ========================================================================================================================================================================================================================================== Package Architecture Version Repository Size ========================================================================================================================================================================================================================================== Installing: mongodb-mongosh-shared-openssl3 x86_64 2.2.2-1.el8 mongodb-org-7.0 52 M Transaction Summary ========================================================================================================================================================================================================================================== Install 1 Package Total download size: 52 M Installed size: 206 M Downloading Packages: mongodb-mongosh-shared-openssl3-2.2.2.x86_64.rpm 12 MB/s | 52 MB 00:04 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Total 12 MB/s | 52 MB 00:04 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : mongodb-mongosh-shared-openssl3-2.2.2-1.el8.x86_64 1/1 Running scriptlet: mongodb-mongosh-shared-openssl3-2.2.2-1.el8.x86_64 1/1 Verifying : mongodb-mongosh-shared-openssl3-2.2.2-1.el8.x86_64 1/1 Installed: mongodb-mongosh-shared-openssl3-2.2.2-1.el8.x86_64 Complete! EmiKitani:~/environment $ バージョン確認 mongosh --version ▼実行結果 EmiKitani:~/environment $ mongosh --version 2.2.2 EmiKitani:~/environment $
証明書バンドルをダウンロードして転送中のデータを暗号化する
Cloud9 と DocumentDB 間の通信を SSL/TLS で暗号化するには証明書バンドルが必要です。証明書バンドルとは、一つまたは複数の証明書が含まれるファイルのことを指します。これにはルート証明書、中間証明書、エンドユーザー証明書などが含まれます。
ハンズオンコンテンツで提供されるコマンドでは、証明書バンドルの古いバージョンがダウンロードされます。代わりに以下のコマンドで新しいものをダウンロードしてください。(このコマンドは DocumentDB コンソールのクラスターの詳細からも確認できます。)
wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
▼実行結果例
EmiKitani:~/environment $ wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem --2024-03-28 05:42:22-- https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem Resolving truststore.pki.rds.amazonaws.com (truststore.pki.rds.amazonaws.com)... 18.172.185.20, 18.172.185.113, 18.172.185.95, ... Connecting to truststore.pki.rds.amazonaws.com (truststore.pki.rds.amazonaws.com)|18.172.185.20|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 183356 (179K) [application/octet-stream] Saving to: ‘global-bundle.pem’ global-bundle.pem 100%[===================================================================================================>] 179.06K 585KB/s in 0.3s 2024-03-28 05:42:23 (585 KB/s) - ‘global-bundle.pem’ saved [183356/183356] EmiKitani:~/environment $
global-bundle.pem
ファイルはセキュアな SSL/TLS 接続を確立するためにクライアント側で必要とされる CA(認証局)証明書のコレクションを提供します。DocumentDB とセキュアに通信するためにはサーバーの証明書をクライアントが信頼する必要があります。サーバー証明書の信頼を確立するために、Cloud9 が Amazon が発行したルート証明書を事前に知っておく必要があります。これにより中間者攻撃に対する保護が強化されます。
DocumentDB へ接続
ここまで準備してきた mongosh
のバージョンでは、マネジメントコンソール上で確認できる mongo
コマンドはそのまま使うことができません。
代わりに以下の mongosh
コマンドを使用してください。<クラスターのエンドポイント> は作成した DocumentDB のものをコピーして入力してください。
mongosh --tls --host <クラスターのエンドポイント>:27017 --tlsCAFile global-bundle.pem --retryWrites=false --username DocDBAdmin
▼実行結果例(パスワードを入力)
EmiKitani:~/environment $ mongosh --tls --host docdb-2024-03-28-02-20-25.cluster-cxkg0swix4f0.ap-northeast-1.docdb.amazonaws.com:27017 --tlsCAFile global-bundle.pem --retryWrites=false --username DocDBAdmin Enter password: *************** Current Mongosh Log ID: 6605d7335689bca78a1852b6 Connecting to: mongodb://<credentials>@docdb-2024-03-28-02-20-25.cluster-cxkg0swix4f0.ap-northeast-1.docdb.amazonaws.com:27017/?directConnection=true&tls=true&tlsCAFile=global-bundle.pem&retryWrites=false&appName=mongosh+2.2.2 Using MongoDB: 5.0.0 Using Mongosh: 2.2.2 For mongosh info see: https://docs.mongodb.com/mongodb-shell/ To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy). You can opt-out by running the disableTelemetry() command. ------ Warning: Non-Genuine MongoDB Detected This server or service appears to be an emulation of MongoDB rather than an official MongoDB product. Some documented MongoDB features may work differently, be entirely missing or incomplete, or have unexpected performance characteristics. To learn more please visit: https://dochub.mongodb.org/core/non-genuine-mongodb-server-warning. ------ rs0 [direct: primary] test>
Cloud9 から DocumentDB に繋がりました!
warning は、今接続した DocumentDB が MongoDB 製品ではなく MongoDB のエミュレーション(模倣)製品であることを示すものです。DocumentDB は MongoDB と互換性がありますが、一部機能に違いがあります。詳細は warning に表示されている URL Connect to a Deployment — MongoDB Shell にも記載がありますし、機能的な違い : Amazon DocumentDB と MongoDB - Amazon DocumentDB にも記載されていますので参照してください。
rs0
:ユーザーが接続しているレプリカセットの名前です。- MongoDB ではデータの高可用性と耐障害性を提供するためにレプリカセットが使用されます。MongoDB の世界では「レプリカセット」と呼ばれる概念が、DocumentDBでは「DocumentDB クラスター」と呼ばれています。
- MongoDB におけるレプリカセットは、複数の MongoDB インスタンス(ノード)で構成され、1 つのプライマリノードと複数のセカンダリノードを持ちます。プライマリノードが書き込み操作を受け付け、セカンダリノードがプライマリノードからデータを複製します。
- DocumentDB では同様の構成を DocumentDB クラスターによって実現しています。DocumentDB クラスターは 1 つのプライマリインスタンスと 1 つ以上のレプリカインスタンスで構成されます。
[direct: primary]
:ユーザーが直接レプリカセットのプライマリノードに接続していることを示しています。- DocumentDB クラスター(レプリカセット)では、プライマリノードがデータの書き込みを受け持ち、セカンダリノードはプライマリノードからのデータの複製(レプリケーション)を受けます。この表示は現在の操作がプライマリノード上で実行されていることを意味します。
test
:現在選択されているデータベースの名前です。
バージョンを確認してみましょう。
rs0 [direct: primary] test> version() 2.2.2 rs0 [direct: primary] test>
また、デフォルトだと「test」という名前のデータベースが一つあるようです。
rs0 [direct: primary] test> show databases test 64.00 KiB rs0 [direct: primary] test>
スキルビルダーで案内されている「単一のドキュメントを挿入する」コマンドを実行してみます。
db.collection.insert({"hello":"DocumentDB"})
▼実行結果
rs0 [direct: primary] test> db.collection.insert({"hello":"DocumentDB"}) DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite. { acknowledged: true, insertedIds: { '0': ObjectId('6605d7a25689bca78a1852b7') } } rs0 [direct: primary] test>
DeprecationWarning
という警告が出ます。これは、db.collection.insert
メソッドが非推奨(deprecated)であることを警告しています。実際にはエラーではなく挿入操作は成功しています。
警告メッセージには、代わりに insertOne
、insertMany
、bulkWrite
の使用が推奨されています。
acknowledged
:操作がデータベースによって認識され、成功したことを意味します。insertedIds
:挿入されたドキュメントの ID です。1 つのドキュメントが挿入され、その ObjectId が表示されています。
では、推奨されているコマンドでもう一度ドキュメントの挿入をやってみたいと思います。まず、今挿入したドキュメントを削除します。
db.collection.deleteOne({_id: ObjectId('6605d7a25689bca78a1852b7')})
▼実行結果
rs0 [direct: primary] test> db.collection.deleteOne({_id: ObjectId('6605d7a25689bca78a1852b7')}) { acknowledged: true, deletedCount: 1 } rs0 [direct: primary] test>
もう一度ドキュメントの挿入をします。
db.collection.insertOne({"hello":"DocumentDB"})
▼実行結果
rs0 [direct: primary] test> db.collection.insertOne({"hello":"DocumentDB"}) { acknowledged: true, insertedId: ObjectId('6605d9105689bca78a1852b8') } rs0 [direct: primary] test>
成功しました。これは collection
という名前のコレクションに {"hello":"DocumentDB"}
という内容のドキュメントを 1 つ挿入した、ということです。
追加したレコードを表示します。
db.collection.findOne()
▼実行結果
rs0 [direct: primary] test> db.collection.findOne() { _id: ObjectId('6605d9105689bca78a1852b8'), hello: 'DocumentDB' } rs0 [direct: primary] test>
うまくいきました!
「複数のレコードを入力する (MongoDB シェル)」以降のコマンドは、スキルビルダーに記載のコマンドがそのまま利用できます。
AWS CLI を使用した DocumentDB の作成部分で注意すること
動画と一部コマンドが異なっており、提供されているコマンドを実行すると以下のようになります。
- DocumentDB がデフォルト VPC のパブリックサブネットに作成されます。
- クラスターパラメーターグループもデフォルトのものが使用されます。
- 削除保護が有効になります。
こちらは接続試行せずすぐに削除しますので特に VPC が異なる点は問題ありませんが、削除する前に削除保護を無効にする点だけ留意してください。
削除するクラスターの詳細を開き、「変更」をクリックします。
削除保護のチェックを外し、「続行」をクリックします。
「すぐに適用」を選択し、「クラスターの変更」をクリックします。
以上の操作で削除保護を外しました。あとはクラスターの詳細からクラスターの削除を実施してください。
おわりに
Amazon DocumentDB のコンソール画面からたどり着けるハンズオンコンテンツとコマンドの最新版をご紹介しました。ご紹介した内容は 2024/3/30 時点の情報です。後ほど更新される可能性がありますので、最新のドキュメントを確認するようにしてください。どなたかのお役に立てば幸いです。